package com.guomei.service.exam;

import com.guomei.bean.exam.domain.Exam;
import com.guomei.bean.exam.vo.ExamPager;
import com.guomei.utils.Result;

import java.util.List;

/**
 * 考试服务接口
 */
public interface ExamService {
    /**
     * 根据ID查询考试
     * @param id 考试ID
     * @return 考试信息
     */
    Exam getById(Long id);

    /**
     * 根据examID 获取考试详情
     * @param examId 考试ID
     * @return 考试详情
     */
    ExamPager getByIdWithQuestions(Long examId);

    /**
     * 查询所有考试
     * @return 考试列表
     */
    List<Exam> getAll();

    /**
     * 根据条件查询考试
     * @param exam 查询条件
     * @return 考试列表
     */
    Result<?> getByCondition(Exam exam);

    /**
     * 新增考试
     * @param exam 考试信息
     * @return 新增结果
     */
    boolean save(Exam exam);

    /**
     * 批量新增考试
     * @param exams 考试列表
     * @return 新增结果
     */
    boolean batchSave(List<Exam> exams);

    /**
     * 更新考试
     * @param exam 考试信息
     * @return 更新结果
     */
    boolean update(Exam exam);

    /**
     * 根据ID删除考试
     * @param id 考试ID
     * @return 删除结果
     */
    boolean removeById(Long id);

    /**
     * 批量删除考试
     * @param ids 考试ID列表
     * @return 删除结果
     */
    boolean batchRemove(List<Long> ids);

    /**
     * 根据课程ID查询考试列表
     * @param courseId 课程ID
     * @return 考试列表
     */
    List<Exam> getByCourseId(Long courseId);

    /**
     * 根据创建人ID查询考试列表
     * @param creatorId 创建人ID
     * @return 考试列表
     */
    List<Exam> getByCreatorId(Long creatorId);

    /**
     * 根据状态查询考试列表
     * @param status 状态
     * @return 考试列表
     */
    List<Exam> getByStatus(Short status);

    /**
     * 根据课程ID列表查询考试列表
     * @param courseIds 课程ID列表
     * @return 考试列表
     */
    List<Exam> getByCourseIds(List<Long> courseIds);

    /**
     * 根据课程ID列表查询考试列表（分页）
     * @param courseIds 课程ID列表
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @return 分页结果
     */
    Result<?> getByCourseIdsWithPage(List<Long> courseIds, Integer pageNum, Integer pageSize);

    /**
     * 获取用户可参加的考试（需要课程学习进度达到80%）
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @return 考试列表
     */
    Result<?> getUserQualifiedExams(Long userId, Integer pageNum, Integer pageSize);
}
